package org.colswe.testingProject.entity;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;

/**
 * Esta clase entidad es usada para almacenar la información correspondiente a
 * los estudiantes.
 *
 * @author Leonardo Bohórquez
 */
@Entity
public class Student implements Serializable {

    /**
     * Constante 45.
     */
    private static final int CUARENTA5 = 45;
    /**
     * Constante 12.
     */
    private static final int DOCE = 12;
    /**
     * Constante 6.
     */
    private static final int SEIS = 6;
    /**
     * Constante true.
     */
    private static final boolean TRUE = true;
    /**
     * Constante false.
     */
    private static final boolean FALSE = false;
    /**
     * Id del estudiante.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    /**
     * Nombre del estudiante.
     */
    @Column(length = CUARENTA5, nullable = FALSE)
    private String name;
    /**
     * Apellido del estudiante.
     */
    @Column(length = CUARENTA5, nullable = FALSE)
    private String lastNames;
    /**
     * Cédula del estudiante.
     */
    @Column(length = DOCE, nullable = FALSE, unique = TRUE)
    private String idNumber;
    /**
     * Código del estudiante.
     */
    @Column(length = SEIS, nullable = FALSE, unique = TRUE)
    private String code;
    /**
     * Programa del estudiante.
     */
    @OneToOne
    @JoinColumn(nullable = FALSE)
    private Program program;
    /**
     * Solicitudes presentadas por el estudiante.
     */
    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL)
    private Collection<Application> applications;

    /**
     * Constructor por defecto de la clase Student.
     */
    public Student() {
    }

    /**
     * Costructor que recibe los parámetros para inicializar la clase Student.
     *
     * @param name Nombre del estudiante.
     * @param lastNames Apellidos del estudiante.
     * @param idNumber Número de cédula del estudiante.
     * @param code Código del estudiante.
     * @param program Programa al que pertenece el estudiante.
     * @param applications Colección de solicitudes presentadas por el
     * estudiante.
     */
    public Student(String name, String lastNames, String idNumber, String code,
            Program program, Collection<Application> applications) {
        this.name = name;
        this.lastNames = lastNames;
        this.idNumber = idNumber;
        this.code = code;
        this.program = program;
        this.applications = applications;
    }

    /**
     * Función que permite obtener la colección con las solicitudes presentadas
     * por el estudiante.
     *
     * @return Colección de solicitudes presentadas por el estudiante.
     */
    public Collection<Application> getApplications() {
        return applications;
    }

    /**
     * Método que permite establecer la colección de solicitudes presentadas por
     * el estudiate.
     *
     * @param applications Colección de solicitudes presentadas por el
     * estudiante.
     */
    public void setApplications(Collection<Application> applications) {
        this.applications = applications;
    }

    /**
     * Función que permite obtener el código del estudiante.
     *
     * @return Código del estudiante.
     */
    public String getCode() {
        return code;
    }

    /**
     * Método que permite establecer el código del estudiante.
     *
     * @param code Código del estudiante.
     */
    public void setCode(String code) {
        this.code = code;
    }

    /**
     * Función para conseguir el Id del estudiante.
     *
     * @return Id del estudiante.
     */
    public Long getId() {
        return id;
    }

    /**
     * Método para establecer el Id del estudiante.
     *
     * @param id Id del estudiante.
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * Función que permite obtener el número de identificación del estudiante.
     *
     * @return Número de identificación del estudiante.
     */
    public String getIdNumber() {
        return idNumber;
    }

    /**
     * Método que permite establecer el número de identidad del estudiante.
     *
     * @param idNumber Número de identificación del estudiante.
     */
    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    /**
     * Función que permite obtener los apellidos del estudiante.
     *
     * @return Apellidos del estudiante.
     */
    public String getLastNames() {
        return lastNames;
    }

    /**
     * Método que permite establecer los apellidos del estudiante.
     *
     * @param lastNames Apellidos del estudiante.
     */
    public void setLastNames(String lastNames) {
        this.lastNames = lastNames;
    }

    /**
     * Función que permite obtener los nombres del estudiantes.
     *
     * @return Nombres del estudiante.
     */
    public String getName() {
        return name;
    }

    /**
     * Método que permite establecer los nombre del estudiante.
     *
     * @param name Nombres del estudiante.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Función que permite agregar una solicitud a la colección de solicitudes
     * del estudiante.
     *
     * @param e Solicitud presentada por el estudiante.
     * @return Verdadero si se agregó correctamente, falso en caso contrario.
     */
    public boolean add(Application e) {
        return applications.add(e);
    }

    /**
     * Función que permite eliminar una solicitud de la colección de solicitudes
     * del estudiante.
     *
     * @param e Solicitud presentada por el estudiante a eliminar.
     * @return Verdadero si se eliminó correctamente, falso en caso contrario.
     */
    public boolean remove(Application e) {
        return applications.remove(e);
    }

    /**
     * Función que permite obtener el programa al que pertenece el estudiante.
     *
     * @return Programa al que pertenece el estudiante.
     */
    public Program getProgram() {
        return program;
    }

    /**
     * Método que permite establecer el programa al que pertenece el estudiante.
     *
     * @param program Programa al que pertenece el estudiante.
     */
    public void setProgram(Program program) {
        this.program = program;
    }
}
